package ipms.appbase;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * @author SPDjnh
 * 封装数据库的操作
 */
public class ClsDataBase {

    public static String sDbDrv = "",  sDbUrl = "",  sDbUsr = "",  sDbPwd = "";

    /**
     * 获取数据库连接对象，使用该类属性数据进行连接
     *
     * @return 连接不成功，抛出错误
     * @throws Exception
     */
    public static Connection getConn() throws Exception {
        Connection conn = null;

        try {
            Class.forName(sDbDrv).newInstance();
            conn = DriverManager.getConnection(sDbUrl, sDbUsr, sDbPwd);
        } catch (Exception ex) {
            throw ex;
        }

        return conn;
    }

    /**
     * 获取数据库连接对象，使用该类属性数据进行连接  
     * * @param sDbDrv
     * @param sDbUrl
     * @param sDbUsr
     * @param sDbPwd
     * @return 连接不成功，抛出错误
     * @throws Exception
     */
    public static Connection getConn(String sDbDrv, String sDbUrl,
            String sDbUsr, String sDbPwd) throws Exception {
        Connection conn = null;

        Class.forName(sDbDrv).newInstance();
        conn = DriverManager.getConnection(sDbUrl, sDbUsr, sDbPwd);

        return conn;
    }

    /**
     * 执行sql语句(insert, update,delete)
     * @param conn
     * @param sql
     * @throws Exception
     */
    public static void execSql(Connection conn, String sql) throws Exception {
        try {
            conn.setAutoCommit(false);
            Statement s = conn.createStatement();
            s.execute(sql);
            conn.commit();
        } catch (SQLException ex) {
            try {
                conn.rollback();
            } catch (SQLException ex1) {
                throw ex1;
            }
            throw ex;
        }
    }

    /**
     * 批量执行sql语句(insert, update,delete)
     * @param conn
     * @param sql 类型是String[]
     * @throws java.lang.Exception
     */
    public static void execSql(Connection conn, String[] sql) throws Exception {
        if(sql.length==0) return;
        try {
            conn.setAutoCommit(false);
            Statement s = conn.createStatement();
            for (int i = 0, length = sql.length; i < length; i++) {
                if (sql[i] != null && !"".equals(sql[i])) {//若sql语句不为null，也不是空字符串
                    s.addBatch(sql[i]);
                }
            }
            s.executeBatch();
            conn.commit();
        } catch (SQLException ex) {
            try {
                conn.rollback();
            } catch (SQLException ex1) {
                throw ex1;
            }
            throw ex;
        } finally {
            conn.setAutoCommit(true);
        }
    }

    /**
     * 批量执行sql语句(insert, update,delete)
     * @param conn
     * @param sql 类型是ArrayList<String>
     * @throws java.lang.Exception
     */
    public static void execSql(Connection conn, ArrayList<String> sql) throws Exception {
        if(sql.size()==0) return;
        try {
            conn.setAutoCommit(false);
            Statement s = conn.createStatement();
            for (String sl : sql) {
                if (!sl.trim().isEmpty()) {//若sql语句不为null，也不是空字符串
                    s.addBatch(sl);
                }
            }
            s.executeBatch();
            conn.commit();
        } catch (SQLException ex) {
            try {
                conn.rollback();
            } catch (SQLException ex1) {
                throw ex1;
            }
            throw ex;
        } finally {
            conn.setAutoCommit(true);
        }
    }

    /**
     * 执行查询
     * @param conn
     * @param sql
     * @return 返回ResultSet对象
     * @throws Exception
     */
    public static ResultSet execQuery(Connection conn, String sql) throws Exception {
        ResultSet rs = null;
        Statement s = conn.createStatement();
        rs = s.executeQuery(sql);

        return rs;
    }

    /**
     * 从resultset获取table形式的数据
     * @param rs
     * @return ArrayList
     * @throws Exception
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
	public static ArrayList getTable(ResultSet rs)  throws Exception{
        ArrayList<HashMap> rows = new ArrayList<HashMap>();

        try {
            ResultSetMetaData rsmd = rs.getMetaData();
            int icc = rsmd.getColumnCount();
            while (rs.next()) {
            	HashMap row = new HashMap();
                for (int i = 1; i <= icc; i++) {
                    row.put(rsmd.getColumnLabel(i), rs.getObject(i));//getColumnLabel 是别名，getColumnName 是原名
                }
                rows.add(row);
            }
            return rows;

        } catch (SQLException ex) {
            throw ex;
        }
    }


    /**
     * 转换字符串日期时间为 MySql 的日期时间，
     * 代替MySql 的函数 str_to_date('yyyy-MM-dd hh:mm:ss','%Y-%m-%d %H:%i:%s')，
     * 注意：若hh:mm:ss=00:00:00，该函数返回null。此时必须去除字符串中的时间部分，ok。
     * @param sDate
     * @return
     */
    public static String mySQL_str_to_date(String sDate) {
        String returnDate = "";
        if (sDate.indexOf(" ") == -1) {//若时间字符串中不包含时间部分
            returnDate = "str_to_date('" + sDate + "','%Y-%m-%d')";
        } else {
            String[] stArr = sDate.split(" ");

            if ("00".equals(stArr[1]) || "00:00".equals(stArr[1]) || "00:00:00".equals(stArr[1])) {
                returnDate = "str_to_date('" + stArr[0] + "','%Y-%m-%d')";
            } else {
                stArr = stArr[1].split(":");
                switch (stArr.length) {
                    case 1:
                        returnDate = "str_to_date('" + sDate + "','%Y-%m-%d %H')";
                        break;
                    case 2:
                        returnDate = "str_to_date('" + sDate + "','%Y-%m-%d %H:%i')";
                        break;
                    case 3:
                        returnDate = "str_to_date('" + sDate + "','%Y-%m-%d %H:%i:%s')";
                        break;
                }
            }
        }
        return returnDate;
    }

	/**
	 * 转换【MySql 的日期时间】为【字符串日期时间】，
	 * 代替MySql 的函数 date_format('yyyy-MM-dd hh:mm:ss','%Y-%m-%d %H:%i:%s')，
	 * @param sDate 格式化前的日期
	 * @param format 格式："y-M-d H:m:s" ===> "%Y-%m-%d %H:%i:%s"
	 * @return
	 */
    public static String mySQL_date_to_str(String sDate, String format) {
		String returnDate = "";
		//              %Y （年）                          %i （分）           %m （月）         %d （日）        %H （24小时）     %h （12小时）       %s （秒）
		String newFormat = format.replace("y", "Y").replace("Y", "%Y").replace("m", "%i").replace("M", "%m").replace("d", "%d").replace("H", "%H").replace("h", "%h").replace("s", "%s");
		
		returnDate = "DATE_FORMAT(" + sDate + ",'" + newFormat + "')";
		return returnDate;
    }
    // ---------------------end ClsDataBase---------------------------------------
}
